﻿using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.Modelo.Entidades;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace Onshi.POS.Repositorios
{
    public class RepositorioDescuentosRecargosCantidades : RepositorioEntidad<DescuentoRecargoCantidad, Int32, IServicioDatosDescuentosRecargosCantidades>
    {
        #region Constructores

        public RepositorioDescuentosRecargosCantidades()
            : base()
        {
        }

        #endregion

        #region Metodos

        private List<DescuentoRecargoCantidadDetalle> TablaAListaDetalles(DataTable tabla)
        {
            var detalles = new List<DescuentoRecargoCantidadDetalle>();
            foreach (DataRow fila in tabla.Rows)
                detalles.Add(FilaADetalle(fila));
            return detalles.OrderBy(x => x.Cantidad).ToList();
        }

        private DescuentoRecargoCantidadDetalle FilaADetalle(DataRow fila)
        {
            var detalle = new DescuentoRecargoCantidadDetalle();
            detalle.Id = (Int32)fila["IdDescuentoRecargoCantidadDetalle"];
            detalle.Cantidad = (Int32)fila["Cantidad"];
            detalle.DescuentoRecargo = (Decimal)fila["DescuentoRecargo"];
            return detalle;
        }

        protected override DescuentoRecargoCantidad FilaAEntidad(DataRow fila)
        {
            var descuentoRecargoCantidad = new DescuentoRecargoCantidad();
            descuentoRecargoCantidad.Id = (Int32)fila["IdDescuentoRecargoCantidad"];
            descuentoRecargoCantidad.Nombre = (String)fila["Nombre"];
            descuentoRecargoCantidad.Observaciones = (String)fila["Observaciones"];
            return descuentoRecargoCantidad;
        }

        public override DescuentoRecargoCantidad DevolverPorId(Int32 id)
        {
            var descuentoRecargoCantidad = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (descuentoRecargoCantidad == null)
                using (var ds = servicioDatos.DescuentosRecargosCantidades_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        descuentoRecargoCantidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        descuentoRecargoCantidad.Detalles = TablaAListaDetalles(ds.Tables[1]);
                        entidades.Add(descuentoRecargoCantidad);
                    }
            return descuentoRecargoCantidad;
        }

        public void Insertar(DescuentoRecargoCantidad descuentoRecargo)
        {
            descuentoRecargo.Id = servicioDatos.DescuentosRecargosCantidades_Insertar(descuentoRecargo.Nombre, descuentoRecargo.Observaciones);
        }

        public void Modificar(DescuentoRecargoCantidad descuentoRecargo)
        {
            servicioDatos.DescuentosRecargosCantidades_Modificar(descuentoRecargo.Id, descuentoRecargo.Nombre, descuentoRecargo.Observaciones);
        }

        public void Eliminar(DescuentoRecargoCantidad descuentoRecargo)
        {
            servicioDatos.DescuentosRecargosCantidades_Eliminar(descuentoRecargo.Id);
            descuentoRecargo = null;
        }

        public List<DescuentoRecargoCantidad> DevolverTodos()
        {
            using (var ds = servicioDatos.DescuentosRecargosCantidades_DevolverTodos())
            {
                entidades = TablaALista(ds.Tables[0]);
                foreach (var descuentoRecargo in entidades)
                {
                    var detalles = ds.Tables[1].AsEnumerable().Where(x => (Int32)x["IdDescuentoRecargoCantidad"] == descuentoRecargo.Id).AsDataView().ToTable();
                    descuentoRecargo.Detalles = TablaAListaDetalles(detalles);
                }
            }
            return entidades;
        }

        public void InsertarDetalle(DescuentoRecargoCantidad descuentoRecargoCantidad, DescuentoRecargoCantidadDetalle detalle)
        {
            detalle.Id = servicioDatos.DescuentosRecargosCantidadesDetalles_Insertar(descuentoRecargoCantidad.Id, detalle.Cantidad, detalle.DescuentoRecargo);
        }

        public void EliminarDetallesPorDescuentoRecargoCantidad(DescuentoRecargoCantidad descuentoRecargoCantidad)
        {
            servicioDatos.DescuentosRecargosCantidadesDetalles_EliminarPorDescuentoRecargoCantidad(descuentoRecargoCantidad.Id);
        }

        #endregion
    }
}